package com.example.meservice.controller;

import cn.hutool.core.bean.BeanUtil;
import com.example.meservice.domain.entity.User;
import com.example.meservice.domain.vo.registerVo;
import com.example.meservice.service.IMeService;
import com.example.meservice.utils.Result;
import jakarta.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.time.LocalDateTime;

/**
 * 用户注册控制器
 * 处理用户注册请求，包含注册信息校验和用户创建逻辑
 *
 * @author czwa
 */
@RestController
@RequestMapping("/register")
public class registerController {

    @Resource
    private StringRedisTemplate stringRedisTemplate;
    @Autowired
    private IMeService userService;

    /**
     * 处理用户注册请求
     * 对注册信息进行多维度校验，校验通过后创建用户记录
     *
     * @param registerVo 包含注册信息的视图对象
     * @return 注册结果（成功/失败）
     */
    @PostMapping
    public Result register(@RequestBody registerVo registerVo) {
        System.out.println(registerVo); // 调试日志，打印接收到的注册信息

        // --------------------- 邮箱信息校验 ---------------------
        String targetEmail = registerVo.getEmail();
        // 基础格式校验（符合标准邮箱格式）
        if (targetEmail == null || !targetEmail.matches("^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$")) {
            return Result.error("邮箱格式不正确");
        }
        // 业务限制校验（仅支持QQ邮箱）
        if (!targetEmail.endsWith("@qq.com")) {
            return Result.error("仅支持 QQ 邮箱");
        }

        // --------------------- 用户名校验 ---------------------
        if (registerVo.getUsername() == null || registerVo.getUsername().length() < 2 || registerVo.getUsername().length() > 16) {
            return Result.error("用户名长度在 2 到 16 个字符");
        }

        // --------------------- 密码校验 ---------------------
        if (registerVo.getPassword() == null || registerVo.getPassword().length() < 6 || registerVo.getPassword().length() > 16) {
            return Result.error("密码长度在 6 到 20 个字符");
        }
        if (!registerVo.getPassword().equals(registerVo.getConfirmPassword())) {
            return Result.error("两次输入的密码不一致");
        }

        // --------------------- 手机号校验 ---------------------
        if (registerVo.getPhone() == null || !registerVo.getPhone().matches("^1[3-9]\\d{9}$")) {
            return Result.error("手机号格式不正确");
        }

        // --------------------- 验证码校验 ---------------------
        if (registerVo.getCode() == null || registerVo.getCode().length() != 6
                || !registerVo.getCode().equals(stringRedisTemplate.opsForValue().get("authCode:" + registerVo.getEmail()))) {
            return Result.error("验证码错误");
        }

        // --------------------- 注册信息转换与保存 ---------------------
        // 将注册视图对象转换为用户实体对象
        User user = BeanUtil.copyProperties(registerVo, User.class);
        // 设置注册时间和默认状态（1表示启用）
        user.setCreateTime(LocalDateTime.now());
        user.setStatus(1);
        // 保存用户到数据库
        userService.save(user);

        return Result.success();
    }
}